package com.zang.blogz.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zang.blogz.dto.ArticleHomeDTO;
import com.zang.blogz.entity.Article;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zang.blogz.model.input.ro.ArticleReviseRO;
import com.zang.blogz.model.output.ArticleSearchVO;
import com.zang.blogz.model.output.ArticleTopVO;
import com.zang.blogz.model.output.admin.AdminArchiveVO;
import com.zang.blogz.model.output.ArchiveVO;
import com.zang.blogz.model.output.ArticleDetailsVO;
import com.zang.blogz.result.Result;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author 朵橙i
 * @since 2022-06-17
 */
public interface ArticleService extends IService<Article> {

    /**
     * 获得首页文章列表
     *
     * @param pageNo   当前位置
     * @param pageSize 每页大小
     * @return Ipage对象
     */
    IPage<ArticleHomeDTO> getIndexArticleInfo(Integer pageNo, Integer pageSize) throws ExecutionException, InterruptedException;

    /**
     * 获得归档文章列表
     *
     * @param pageNo   当前位置
     * @param pageSize 每页大小
     * @return Ipage对象
     */
    IPage<ArchiveVO> getListArchiveVo(Integer pageNo, Integer pageSize);

    /**
     * 获得文章详情页信息
     *
     * @param id 文章id
     * @return 文章详情页对象
     */
    Result<ArticleDetailsVO> getBlogDetail(Integer id);

    /**
     * 获取管理员文章列表页
     *
     * @param pageNo
     * @param pageSize
     * @return {@link Result}<{@link IPage}<{@link AdminArchiveVO}>>
     */
    Result<IPage<AdminArchiveVO>> getAdminArchiveVoList(Integer pageNo, Integer pageSize);

    /**
     * 更改文章置顶状态
     *
     * @param articleId
     * @return {@link Result}<{@link String}>
     */
    Result<String> updateTopStatus(Integer articleId);

    /**
     * 编辑或保存文章
     *
     * @param articleReviseRo
     * @return {@link Result}<{@link String}>
     */
    Result<String> reviseOrSaveArticle(ArticleReviseRO articleReviseRo);

    /**
     * 得到分类id和其对应的文章数
     *
     * @return 分类id和其对应的文章数
     */
    Map<Integer, Integer> getArticleCount();

    /**
     * 根据分类id得到分类下的文章数
     *
     * @param categoryId
     * @return long
     */
    long getArticleCountByCategoryId(Integer categoryId);

    /**
     * 获取置顶文章
     *
     * @return {@link List}<{@link ArticleTopVO}>
     */
    List<ArticleTopVO> getTopArticle();

    /**
     * 点赞文章
     *
     * @param articleId 文章id
     * @return {@link Result}<{@link String}>
     */
    Result<String> saveArticleLike(Integer articleId);


    /**
     * @param keywords 搜索内容
     * @return {@link Result}<{@link List}<{@link ArticleSearchVO}>>
     */
    Result<List<ArticleSearchVO>> listArticlesBySearch(String keywords);


    /**
     * @param articleIds 文章id
     * @return {@link List}<{@link String}>
     */
    List<String> exportArticles(List<Integer> articleIds);
}
